package com.atguigu.srb;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;

/**
 * @author pactera
 * @since 2021-08-27 星期五 9:55
 */
public class CodeGenerator {

  @Test
  public void genCode() {
    // 1、创建代码生成器
    AutoGenerator generator = new AutoGenerator();

    // 2、全局配置
    GlobalConfig globalConfig = new GlobalConfig();
    globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
    globalConfig.setAuthor("Alice");
    // 生成后是否打开文件资源管理器
    globalConfig.setOpen(false);
    // 去掉 Service 接口的首字母 I
    globalConfig.setServiceName("%sService");
    // 主键生成策略
    globalConfig.setIdType(IdType.AUTO);
    // 开启 Swagger2 模式
    globalConfig.setSwagger2(true);
    generator.setGlobalConfig(globalConfig);

    // 3、数据源配置
    DataSourceConfig dataSource = new DataSourceConfig();
    dataSource.setUrl("jdbc:mysql://192.168.56.101:3306/db200921_srb_core?serverTimezone=GMT%2B8&characterEncoding=utf-8");
    dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
    dataSource.setUsername("root");
    dataSource.setPassword("admin");
    dataSource.setDbType(DbType.MYSQL);
    generator.setDataSource(dataSource);

    // 4、包配置
    PackageConfig packageConfig = new PackageConfig();
    packageConfig.setParent("com.atguigu.srb.core");
    // 此对象与数据库表结构一一对于，通过 DAO 层向上传输数据源对象
    packageConfig.setEntity("pojo.entity");
    generator.setPackageInfo(packageConfig);

    // 5、策略配置
    StrategyConfig strategyConfig = new StrategyConfig();
    // 数据库表映射到实体类的命名策略
    strategyConfig.setNaming(NamingStrategy.underline_to_camel);
    // 数据库表字段映射到实体类字段的命名策略
    strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
    // lombok
    strategyConfig.setEntityLombokModel(true);
    // 逻辑删除的字段名
    strategyConfig.setLogicDeleteFieldName("is_deleted");
    // 去掉布尔值的"is_"前缀（确保tinyint(1)）
    strategyConfig.setEntityBooleanColumnRemoveIsPrefix(true);
    // RESTFul api 风格的控制器
    strategyConfig.setRestControllerStyle(true);
    generator.setStrategy(strategyConfig);

    // 6、执行
    generator.execute();
  }
}
